package com.application.spider.model;

import java.util.LinkedList;
import java.util.List;

import com.application.spider.entities.Sede;
import com.application.spider.entities.alias.AttributeDataType;
import com.application.spider.entities.alias.DataType;
import com.application.spider.entities.regex.SedeRegex;
import com.application.spider.exception.ItemNotFoundException;
import com.application.spider.exception.PageNotFoundException;
import com.application.spider.model.alias.ManagerSinonimos;

public class RetrieveSedes extends RetrivierWeb{

	public RetrieveSedes(ManagerSinonimos managerSinonimos) {
		super(managerSinonimos);
		setDataType(DataType.sede);
	}
	public List<Sede> retrieve(SedeRegex sedeRegex,String charset) throws PageNotFoundException, ItemNotFoundException {
		List<String> 	datos = null;
		String 			dato = null;
		List<Sede> 		sedes = null;
		Sede			sede = null;
		String			url = "";
		String 			page = "";
		String			regexPage = "";
		Integer			groupIdPage = 0;
		String			regexSedeData = "";
		
		if(sedeRegex!=null){
			url = sedeRegex.getUrl();
			page = sedeRegex.getPage();
			regexPage = sedeRegex.getRegexPage();
			groupIdPage = sedeRegex.getGrupoIdPage();
			regexSedeData = sedeRegex.getRegexData();
			dato = getWebPageContent(url,page, regexPage,groupIdPage,charset);
			if(!dato.isEmpty()){
				//obtengo cada uno de los elementos
				datos = getValues("sede item",dato,regexSedeData,1);
				if(datos!=null && !datos.isEmpty()){
					sedes = new LinkedList<Sede>();
					for (String item : datos) {
						sede = buildSede(sedeRegex,item,charset);
						if(sede!=null){
							sedes.add(sede);
						}
					}
				}else{
					throw new ItemNotFoundException("no se pudo encontrar el valor del item de la pagina web "+url+" con los limites '"+regexPage+"' y charset "+charset+" regex sede data "+regexSedeData);
				}
			}else{
				throw new PageNotFoundException("no se pudo encontrar la pagina web "+url+" con los limites '"+regexPage+"' y charset "+charset);
			}
		}
		return sedes;
	}
	private Sede buildSede(SedeRegex sedeRegex, String dato, String charset) throws ItemNotFoundException {
		Sede sede = new Sede();
		sede.setNombre(getValueWhitoutException(AttributeDataType.nombre, dato,sedeRegex.getRegexNombre(),charset));
		sede.setPais(getValueWhitoutException(AttributeDataType.pais, dato,sedeRegex.getRegexPais(),charset));
		sede.setProvincia(getValueWhitoutException(AttributeDataType.provincia, dato,sedeRegex.getRegexProvincia(),charset));
		sede.setLocalidad(getValueWhitoutException(AttributeDataType.localidad, dato,sedeRegex.getRegexLocalidad(),charset));
		sede.setBarrio(getValueWhitoutException(AttributeDataType.barrio, dato,sedeRegex.getRegexBarrio(),charset));		
		sede.setDireccion(getValueWhitoutException(AttributeDataType.direccion, dato,sedeRegex.getRegexDireccion(),charset));
		sede.setCodigoPostal(getValueWhitoutException(AttributeDataType.codigopostal, dato,sedeRegex.getRegexCodigoPostal(),charset));
		sede.setListaTelefono(getValuesWhitoutException(AttributeDataType.telefono, dato,sedeRegex.getRegexTelefono(),charset));
		return sede;
	}
//	private List<String> getValuesWhitoutException(AttributeDataType tipo, String dato, ItemRegex itemRegex, String charset) {
//		List<String> values = null;
//		try {
//			values = getValues(tipo, dato, itemRegex, charset);
//		} catch (Exception e) {
//			logger.error(e);
//		}
//		return values;
//	}
//	private String getValueWhitoutException(AttributeDataType tipo, String dato, ItemRegex itemRegex, String charset) {
//		String value = null;
//		try {
//			value = getValue(tipo, dato, itemRegex, charset);
//		} catch (Exception e) {
//			logger.error(e);
//		}
//		return value;
//	}
//	private List<String> getValues(AttributeDataType tipo, String dato, ItemRegex itemRegex, String charset) throws ItemNotFoundException {
//		List<String> values= new LinkedList<String>();
//		List<String> valuesTmp= new LinkedList<String>();
//		String value = "";
//		if(!dato.isEmpty()){
//			if(itemRegex!=null){
//				if(itemRegex.getEnabled()){
//					if(itemRegex.getIsStaticValue()){
//						valuesTmp.add(itemRegex.getStaticValue());
//					}else{
//						if(itemRegex.isIndependent()){
//							dato = getWebPageContent(itemRegex.getUrl(), itemRegex.getStartPage(), itemRegex.getEndPage(), charset);
//						}
//						if(!itemRegex.getRegexData().isEmpty()){
//							List<String> datos = null;
//						
//							datos = getValues(tipo.toString(),dato,itemRegex.getRegexData(),1);
//							if(datos!=null && !datos.isEmpty()){								
//								for (String item : datos) {
//									valuesTmp.addAll(getValuesTmp(tipo, item, itemRegex, charset));
//								}
//							}
//
//						}else{
//							valuesTmp = getValuesTmp(tipo, dato, itemRegex, charset);
//						}
//					}
//					for (String valueItemTmp : valuesTmp) {
//						if(managerSinonimos.containsKey(dataType, tipo, value)){
//							value = managerSinonimos.getValue(dataType, tipo,value);
//						}else{
//							value = valueItemTmp;
//						}
//						logger.info("el valor encontrado es "+value);
//						values.add(value);
//					}
//					
//				}else{
//					logger.info("el tipo "+tipo+" esta deshabilitado para obtener la informacion");
//				}
//			}else{
//				logger.warn("el tipo "+tipo+" es null para obtener la informacion");
//			}
//		}else{
//			throw new ItemNotFoundException("el dato del "+tipo+" vino vacio");
//		}
//		if(values.isEmpty()){
//			throw new ItemNotFoundException("el "+tipo+" no fue encontrado para la regex ");
//		}
//		return values;
//	}
//	private List<String> getValuesTmp(AttributeDataType tipo,String dato,ItemRegex itemRegex,String charset) throws ItemNotFoundException{
//		List<String> 	valuesTmp = null;
//		String 			value="";
//		if(itemRegex.isConditional()){
//			valuesTmp = new LinkedList<String>();
//			for (String regexConditional : itemRegex.getConditioanlMapKeys()) {
//				try{
//					value = getValue(tipo.toString(), dato, regexConditional, 0);
//					if(!value.isEmpty()){
//						value = itemRegex.getConditioanlMapValue(regexConditional);
//						if(!valuesTmp.contains(value)){
//							valuesTmp.add(value);											
//						}
//						break;
//					}
//				}catch (Exception e) {								
//				}
//			}
//			if(value.isEmpty()){
//				throw new ItemNotFoundException("el "+tipo+" no fue encontrado para la regex condicionales "+itemRegex.getConditioanlMapKeys()+" del dato "+dato);
//			}
//		}else{
//			valuesTmp = getValues(tipo.toString(), dato, itemRegex.getRegexItem(), itemRegex.getGroupoId());
//		}
//		return valuesTmp;
//	}
//	private String getValue(AttributeDataType tipo,String dato,ItemRegex itemRegex,String charset) throws ItemNotFoundException{
//		String value="";
//		if(!dato.isEmpty()){
//			if(itemRegex!=null){
//				if(itemRegex.getEnabled()){
//					if(itemRegex.getIsStaticValue()){
//						value = itemRegex.getStaticValue();
//					}else{
//						if(itemRegex.isIndependent()){
//							dato = getWebPageContent(itemRegex.getUrl(), itemRegex.getStartPage(), itemRegex.getEndPage(), charset);
//						}
//						if(itemRegex.isConditional()){
//							for (String regexConditional : itemRegex.getConditioanlMapKeys()) {
//								try{
//									value = getValue(tipo.toString(), dato, regexConditional, 0);
//									if(!value.isEmpty()){
//										value = itemRegex.getConditioanlMapValue(regexConditional);
//										break;
//									}
//								}catch (Exception e) {								
//								}
//							}
//							if(value.isEmpty()){
//								throw new ItemNotFoundException("el "+tipo+" no fue encontrado para la regex condicionales "+itemRegex.getConditioanlMapKeys()+" del dato "+dato);
//							}
//						}else{
//							value = getValue(tipo.toString(), dato, itemRegex.getRegexItem(), itemRegex.getGroupoId());
//						}						
//					}
//					if(managerSinonimos.containsKey(dataType, tipo, value)){
//						value = managerSinonimos.getValue(dataType, tipo,value);
//					}
//				}else{
//					logger.info("el tipo "+tipo+" esta deshabilitado para obtener la informacion");
//				}
//			}else{
//				logger.warn("el tipo "+tipo+" es null para obtener la informacion");
//			}
//		}else{
//			throw new ItemNotFoundException("el dato del "+tipo+" vino vacio");
//		}
//		logger.info("el valor encontrado es "+value);
//		return value;
//	}
}
